package com.fps.webshop.question.question0001_0099;

/**
 * 7. 整数反转
 * 
 * 给你一个 32 位的有符号整数 x ，返回将 x 中的数字部分反转后的结果。
 * 
 * 如果反转后整数超过 32 位的有符号整数的范围 [−2^31,  2^31 − 1] ，就返回 0。
 * 
 * 假设环境不允许存储 64 位整数（有符号或无符号）。
 * 
 * 示例 1：
 * 输入：x = 123
 * 输出：321
 * 
 * 示例 2：
 * 输入：x = -123
 * 输出：-321
 * 
 * 示例 3：
 * 输入：x = 120
 * 输出：21
 * 
 * 示例 4：
 * 输入：x = 0
 * 输出：0
 * 
 * 提示：
 * 		-2^31 <= x <= 2^31 - 1
 */
public class Question007 {

	/**
	 * 第一次提交，虽然是7 ms，但还是要比别人长很多，估计是转换成String再转换回来造成的损失，可以尝试是否直接从数字下手
	 * 提交结果	执行用时	内存消耗	语言		提交时间				备注 
	 * 通过 		7 ms	36.2 MB	Java	2021/08/06 10:08
	 */
	public static int reverse(int x) {
		String s = Integer.toString(x);
		char[] ss = s.toCharArray();
		long sum = 0;
		long yimes = 1;
		Boolean isF = false;
		for(int i=0;i<s.length();i++) {
			if(i==0) {
				if(ss[0]=='-') {
					isF=true;
				}else {
					sum = sum+Integer.parseInt(ss[0]+"");
					yimes=10;
				}
			}else {
				sum=sum+Integer.parseInt(ss[i]+"")*yimes;
				yimes = yimes*10;
			}
		}
		if(sum > Integer.MAX_VALUE || sum < Integer.MIN_VALUE) {
			return 0;
		}
		if(isF) {
			return 0-(int)sum;
		}else {
			return (int)sum;
		}
    }
	
	
	
	/**
	 * 第二次提交，尝试直接使用数字进行计算解决，不再转化成字符串
	 * 没有归纳数学规律，暴力解决
	 * 提交结果	执行用时	内存消耗	语言		提交时间				备注 
	 * 通过 		1 ms	35.6 MB	Java	2021/08/06 10:18
	 */
	public static int reverse2(int x) {
		long sum = 0;
        while(x != 0) {
        	sum = sum*10 + x%10;
            x = x/10;
        }
		if(sum > Integer.MAX_VALUE || sum < Integer.MIN_VALUE) {
			return 0;
		}
		return (int)sum;
    }
	
	public static void main(String[] args) {
		System.out.print(reverse(1534236499));
		
		//System.out.print(10<<5);
	}

}
